import cloud from "@lafjs/cloud";
import * as crypto from "crypto";
export interface JsonResult {
  code: number;
  msg: string;
  data: object | any | null;
}

// 配置项
const config = {
  name: "laf-admin", // 当前应用名称
  collectionPrefix: "admin", // 数据库前缀
  sharedPrefix: "admin" // 全局缓存前缀
};

// 统一数据库集合的名称
// 使用 collection('user') 访问数据库时，则会去访问 firefly_user 数据集合。
// 保证各项目之间数据库独立，且不容易混淆。
export const collection = name => {
  return cloud.database().collection(`${config.collectionPrefix}_${name}`);
};

// 统一缓存前缀
// 同样保证各项目之间缓存独立，不易混淆。
export const shared = {
  get(key) {
    return cloud.shared.get(`${config.sharedPrefix || ""}_${key}`);
  },
  set(key, value) {
    return cloud.shared.set(`${config.sharedPrefix || ""}_${key}`, value);
  }
};

export function resultOk(
  data: object | any | null,
  msg = "ok",
  code = 0
): JsonResult {
  return {
    code: code,
    msg: msg,
    data: data
  };
}
// 失败返回值
export function resultFail(msg = "fail", code = -1): JsonResult {
  return {
    code: code,
    msg: msg,
    data: null
  };
}
//列表转成树结构
export const listToTree = (list, key, parentId) => {
  const map = list.reduce((acc, item) => {
    acc[item[key]] = { ...item };
    return acc;
  }, {});

  const roots = [];
  list.forEach(item => {
    if (Number(item[parentId]) !== 0 || !item[parentId]) {
      if (!map[item[parentId]].children) {
        map[item[parentId]].children = [];
      }
      map[item[parentId]].children.push(map[item[key]]);
    } else {
      roots.push(map[item[key]]);
    }
  });

  return roots;
};
//判断是否是空对象
export const isEmptyObject = obj => {
  return Object.keys(obj).length === 0;
};
export function hashPassword(content: string): string {
  return crypto.createHash("sha256").update(content).digest("hex");
}

/**
 * 判断用户是否有权限
 * @param uid 用户ID
 * @param permission 权限名
 * @returns 0 表示用户有权限， 401 表示用户未登录， 403 表示用户未授权
 */
export async function checkPermission(
  uid: string | any,
  permission: string
): Promise<number> {
  if (!uid) {
    return 401;
  }
  const { permissions } = await getPermissions(uid);

  if (!permissions.includes(permission)) {
    return 403;
  }
  return 0;
}

/**
 * 通过 user id 获取权限列表
 * @param role_ids
 * @returns
 */
export async function getPermissions(uid: string) {
  const db = cloud.database();
  // 查用户
  const { data: admin } = await db
    .collection("admin-staff")
    .where({ _id: uid })
    .getOne();

  // 查角色
  const { data: roles } = await db
    .collection("role")
    .where({
      name: {
        $in: admin.roles ?? []
      }
    })
    .get();

  if (!roles) {
    return { permissions: [], roles: [], user: admin };
  }

  const permissions = [];
  for (const role of roles) {
    const perms = role.permissions ?? [];
    permissions.push(...perms);
  }

  return {
    permissions,
    roles: roles.map(role => role.name),
    user: admin
  };
}
